package excel;

import guice.IExcelIteraction;
import logic.Good;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import util.Preconditions;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Волков Олег on 13.05.14.
 */
public class ExcelIteraction implements IExcelIteraction {

    private static final Logger logger = Logger.getLogger(ExcelIteraction.class);

    /**
     * Метод считывает данные из Excel-файла, записывает элементы каждого поля как
     * соответствующие свойства объекта класса Good, затем получившиеся объекты добавляет
     * в коллекцию ArrayList
     *
     * @return возвращает коллекцию объектов класса Good
     * @throws FileNotFoundException
     * @throws IOException
     */
    public List<Good> excelImport(File excelFile) {
        List<Good> result = new ArrayList<Good>();
        FileInputStream file = null;
        try {
            file = new FileInputStream(excelFile);
            HSSFWorkbook workbook = null;
            workbook = new HSSFWorkbook(file);
            HSSFSheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            if (rowIterator.hasNext()) rowIterator.next();
        /*
         * Цикл добавления информации в объекты класса Good
         */
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                Good good = new Good();
                Cell cell = row.getCell(0);
                good.setName(cell.getStringCellValue());
                cell = row.getCell(1);
                good.setDescription(cell.getStringCellValue());
                cell = row.getCell(2);
                good.setPrice(cell.getNumericCellValue());
                result.add(good);
            }

            file.close();
        } catch (IOException e) {
            logger.error("IO problems " + e);
        }
        return result;
    }

    /**
     * Метод записывает сохраненные на веб-странице данные в Excel-файл
     *
     * @param goodsList коллекция объектов класса Good, элементы которой отображаются
     *                  на странице
     */
    public void excelExport(List<Good> goodsList) {
        Preconditions.notNull(goodsList);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet sheet = hssfWorkbook.createSheet("0");

        /*
         * В цикле формируется форма для загрузки результатов в Excel-файл
         */
        int i = 0;
        for (Good good : goodsList) {
            HSSFRow row = sheet.createRow(i);
            row.createCell(0).setCellValue(good.getName());
            row.createCell(1).setCellValue(good.getDescription());
            row.createCell(2).setCellValue(good.getPrice());
            i++;
        }

        // Запись в файл
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ExternalContext externalContext = facesContext.getExternalContext();
            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=\"Goods.xls\"");
            // Запись
            hssfWorkbook.write(response.getOutputStream());
            // Закрытие потока
            facesContext.responseComplete();
        } catch (IOException e) {
            logger.error("IO problems " + e);
        }
    }
}

